{
/**
 * type 类型别名 = {
 *  属性：类型
 * }
 * type 写成一行 需要分号或者逗号
 * interface 接口 - 他只支持换行的写法
 *  interface 接口名 {
 *      属性：类型
 *  }
 * 
 *  练习 定义接口 Person
 *  属性 姓名 年龄
 *  方法 play study
 */
    interface Person {
        name: string;
        age: number;
        play?: () => void;
        study?(): void;
    }
    const p: Person = {
        name: 'zs',
        age: 18,
    }
    p

    // 2d直角坐标系 x坐标 y坐标
    // 3d坐标系 x，y，多一个z坐标
    interface Point2D {
        x: number
        y: number
    }
    const point2d: Point2D = {
        x: 1,
        y: 2
    }
    point2d
    // 继承 extends 目的为了复用 interface xxx extends yyy
    // xxx 会继承 yyy 的属性和方法
    // xxx 除了自己的属性和方法 还有yyy的属性和方法
    interface Point3D extends Point2D{
        z: number
    }
    const point3d: Point3D = {
        x: 1,
        y: 2,
        z: 3
    }
    point3d
}
{
    // 类型别名 标识不能重复 如果重复会报错
    type Point2D = {
        x: number
        y: number
    }
    const point2d: Point2D = {
        x: 1,
        y: 2
    }
    point2d
    // type中的复用 不是用extends
    // 他的复用语法 要用到“交叉类型”  xxx & yyy
    // 他的意思是 xxx 和 yyy 里面的属性方法组合在一起 达到复用的作用
    type Point3D  =  {
        z: number
    } & Point2D
    const point3d: Point3D = {
        x: 1,
        y: 2,
        z: 3
    }
    point3d

    // interface 和 type 相同点
    // 1. interface 和 type 都能定义对象属性
    // 2. 他们都可以复用

    // interface 和 type的区别 (只要记以下4个区别点 因为涵盖相同点也说明了不同点 )
    /**
     * 0.（不重要）面试可说可不说的一个不同点 语法不一样
     * type 类型别名 = 类型
     * interface 接口名 {} 
     * 
     * 1. type除了可以定义对象类型 还能定义其他类型 比如联合类型
     *      接口只能定义对象类型
     * 2. 都可以复用的语法不一样
     *       interface的复用 用的是继承 关键字 extends
     *       type的复用  用的交叉类型 语法是 &
     * 
     * 3.（关键） type 类型别名 重复声明 是会报错的
     *          interface 不会报错，他还会自动合并(几个一样的接口名属性方法会合并)
     */

    /**
     * type 和 interface 到底选哪个
     * 个人喜欢type 并且优医问诊都是用type
     * ts在刚出来的时候 是先出interface 在出type的
     */
    type MyType = string | number // 联合类型
    // type MyNumber = number
    let n: MyType = '1'
    n
    // type 不能重复声明
    // type MyType = boolean | null

    interface A {
        name: string
    }
  // 重复声明 接口名 不会报错，里面的属性方法还会合并
    interface A {
        age: number
    }
    interface A {
        sayHi?() :void
    }
    const a:A = {
        name: 'zs',
        age: 18
    }
    a

}

export { }
